package de.akabahn.ebd.stw.gsii.zda;

import org.apache.log4j.Logger;

import de.akabahn.ebd.stw.gsii.zda.exception.ZDABlockedException;
import de.akabahn.ebd.stw.gsii.zda.exception.ZDARestartException;

/**
 * Main-Klasse der Anwendung, Start des Stellwerks<br>
 * <br>
 * Uebergabeparameter:<br>
 * <ul>
 * <li><code>-nowait</code>: Beenden der Anwendung mit Fehlermeldung, wenn die Sperre gesetzt ist</li>
 * <li><code>-force</code>: Starten des Stellwerks auch bei gesetzter Sperre</li>
 * </ul>
 * 
 * @author Peter Eimann
 */
public class ZDALauncher {

	private final static Logger LOG = Logger.getLogger(ZDALauncher.class);

	/**
	 * Main-Methode der Anwendung.<br>
	 * Return-Codes:<br>
	 * <ul>
	 * <li>0: Anwendung wurde ohne Fehler beendet</li>
	 * <li>1: Starten von Armstroffmeiler gesperrt</li>
	 * <li>2: Anwendung soll restartet werden</li>
	 * <li>3: Anwendung wurde durch einen Fehler beendet</li>
	 * </ul>
	 * 
	 * @param args Uebergabeparameter (siehe Beschreibung der Klasse)
	 */
	public static void main(String[] args) {
		boolean nowait = false;
		boolean sperrUmgehung = false;

		ZDAMain main = null;
		try {
			LOG.fatal("Starte Armstroffmeiler GsII Version: " + ZDAMain.VERSION);

			if (args != null) {
				for (String arg : args) {
					if ("-nowait".equals(arg)) {
						nowait = true;
					} else if ("-force".equals(arg)) {
						sperrUmgehung = true;
					}
				}
			}

			main = new ZDAMain(nowait, sperrUmgehung);
			main.start();
			System.exit(0);
		} catch (ZDABlockedException be) {
			LOG.error("Start von Armstroffmeiler gesperrt", be);
			System.out.println("Start von Armstroffmeiler gesperrt: " + be.getValue());
			System.exit(1);
		} catch (ZDARestartException re) {
			LOG.error("Restart Armstroffmeiler", re);
			System.out.println("Restart Armstroffmeiler");
			System.exit(2);
		} catch (Throwable t) {
			LOG.error("Anwendung aufgrund eines Fehlers beendet", t);
			System.err.println("Anwendung aufgrund eines Fehlers beendet:");
			t.printStackTrace();
			System.exit(3);
		}
	}
}
